package com.xusj.function

/**
 * 高级函数
 *
 * @author xushijian
 * @date 2020/5/18 11:03
 *
 */
object FunctionAdvanced {

  def main(args: Array[String]): Unit = {

    //1. map函数用于对集合中的每个元素进行转换

    // (对所有元素加 1）
    println(List(1, 2, 3, 4, 5).map(_ + 1))

    //获取Map中所有的Key
    println(Map("java" -> "a", "scala" -> "s", "spark" -> "s").map(_._1))

    println(Map("java" -> "a", "scala" -> "s", "spark" -> "s").map(x => x._1))

    println(Map("java" -> "a", "scala" -> "s", "spark" -> "s").map {
      case (k, v) => k
    })

    //获取Map中所有的Value
    println(Map("java" -> "a", "scala" -> "s", "spark" -> "s").map(_._2))


    //2. flatten 函数用于对嵌套的集合展开，函数接收的参数类型为集合类型
    println(List(List(1, 2, 3, 4, 5), List(6, 7, 8, 9, 10)).flatten(x => x.reverse))

    println(List(List(1, 2, 3, 4, 5), List(6, 7, 8, 9, 10)).flatten)

    //3. flatMap 函数结合了flat 和 map 两个功能函数
    println(List(List(1, 2, 3, 4, 5), List(9, 8, 2, 3)).flatMap(x => x.map(x => x + 1)))

    println(List(List(1, 2, 3, 4, 5), List(9, 8, 2, 3)).flatMap(_.map(_ + 1)))

    //4. filter函数用于筛选集合中满足某些条件的元素
    //需要先调用flatten 将集合展开
    println(List(List(1, 2, 3, 4, 5), List(9, 8, 2, 3)).flatten.filter(x => x > 3))

    var list = List(List(1, 2, 3, 4, 5), List(9, 8, 2, 3))

    println(list.flatten(x => x).filter(_ > 3))

    println(List(9, 8, 2, 3).filter(x => x > 3))

    //5. reduce 函数用于对集合做聚合，接受两个参数，常用于把当前结果和集合的下一个元素累加

    println(List(1, 2, 3, 4, 5, 6).reduce((x, y) => x * y))

    println(List(1, 2, 3, 4, 5, 6).reduce(_ * _))


  }
}
